package fr.miage.dao.traitements;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import sun.net.www.content.text.plain;

import fr.miage.client.metier.entite.Admin;
import fr.miage.client.metier.entite.Categorie;
import fr.miage.client.metier.entite.Civilite;
import fr.miage.client.metier.entite.Client;
import fr.miage.client.metier.entite.Commande;
import fr.miage.client.metier.entite.Produit;
import fr.miage.client.metier.entite.Role;
import fr.miage.client.metier.entite.Ville;

/**
 * @author kristela
 * 
 */
public class ProduitDao {

	/**
	 * Retourne une session.
	 * 
	 * @return la session.
	 */
	public static Session getSession() {
		Configuration config = new Configuration();
		config.addClass(Client.class);
		config.addClass(Commande.class);
//		config.addClass(Lignecommande.class);
		config.addClass(Produit.class);
		config.addClass(Admin.class);
		config.addClass(Categorie.class);
		config.addClass(Civilite.class);
		config.addClass(Role.class);
		config.addClass(Ville.class);
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		return session;
	}

	/**
	 * Ajoute un nouveau Produit dans la base de donnees.
	 * 
	 * 
	 */
	public static void insertProduit(Produit produit) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.save(produit);
			// int s=session.createSQLQuery("INSERT INTO Admin
			// VALUES("+admin.getIdAdmin()+",\""+commande.getNom()+"\");").executeUpdate();
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	}

	/**
	 * renvoi un produit
	 * 
	 * @param produit
	 * @return
	 */
	public static Produit selectProduit(Produit produit) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		// Categorie commande = session.load(LigneCommande.class, commande);
//		Integer id = (Integer) session.createSQLQuery(
//				"SELECT idProd FROM produit WHERE idProd=\""
//						+ produit.getIdProd() + "\";").uniqueResult();
//		
//		String sql=getProduitCritere(produit);
		Produit cLoad =new Produit();//(Produit)session.createSQLQuery(sql).uniqueResult();
		session.load(cLoad, produit.getIdProd());
		session.close();
		session.getSessionFactory().close();
		return cLoad;
	}

	/**
	 * Renvoie la liste de touts les Produits.
	 * 
	 * @return tous les admins.
	 */
	public static List<Produit> selectAllProduit() {
		List<Produit> listProduit = new ArrayList<Produit>();
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		listProduit = (List<Produit>) session.createQuery("Select p from Produit p").list();
		ArrayList<Produit>pList=new ArrayList<Produit>();
		for (int i = 0; i < listProduit.size(); i++) {
			Produit produit=listProduit.get(i);
			Utilitaire.convertProduit(produit);
			pList.add(produit);
		}
		// listAdmin =session.createSQLQuery("SELECT * FROM
		// LigneCommande;").list();
		session.close();
		session.getSessionFactory().close();
		return pList;
	}

	/**
	 * Lister les produits d'une categorie
	 * 
	 * @param categorie
	 * @return
	 */
	public static List<Produit> selectProduitByCategorie(Categorie categorie) {
		List<Produit> listProduit = new ArrayList<Produit>();
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}

//		String sql = "SELECT idProd,categorie,nomProd, description, stockPhysique, "
//				+ "stockReel,prix FROM produit WHERE idcate=\""
//				+ categorie.getIdCate() + "\";";
//		listProduit = session.createSQLQuery(sql).list();
		String hsql="select p from Produit p where p.idCate="+categorie.getIdCate();
		listProduit=(List<Produit>)session.createQuery(hsql).list();
		ArrayList<Produit>pList=new ArrayList<Produit>();
		for (int i = 0; i < listProduit.size(); i++) {
			Produit produit=listProduit.get(i);
			Utilitaire.convertProduit(produit);
			pList.add(produit);
		}
		// listAdmin =session.createSQLQuery("SELECT * FROM
		// LigneCommande;").list();
		session.close();
		session.getSessionFactory().close();
		return pList;
	}

	/**
	 * Effacer un Produit.
	 * 
	 * @param numero
	 *            le numero du compte.
	 */
	public static void deleteProduit(Produit produit) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		} else {
//			session.createSQLQuery("DELETE FROM produit WHERE idProd="+produit.getIdProd()+";");
			session.delete(produit);
		}
		session.close();
		session.getSessionFactory().close();
	}

	/**
	 * Met à jour un produit dans la base de données.
	 * 
	 * @param produit
	 */
	public static void updateProduit(Produit produit) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		} else {
			session.update(produit);
		}
		session.close();
		session.getSessionFactory().close();
	}

	/**
	 * renvoi lalise des produits concerne pr une ligne de commande
	 * 
	 * @param ligneCommande
	 * @return
	 */
	public static List<Produit> getProduitByCommande(
			Commande commande) {
		List<Produit> listProduit = new ArrayList<Produit>();
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		String hsql = "Select p from Produit p WHERE "
				+ " idProd="+ commande.getProduit().getIdProd() + " ";
//		Produit p = (Produit) session.createSQLQuery(sql).uniqueResult();
//		String hsql="select p from Produit p, Lignecommande lc where p.idProd=lc.idProduit AND lc.idProduit="+ligneCommande.getProduit().getIdProd();
		Produit p=(Produit)session.createQuery(hsql).uniqueResult();
		
		for (int i = 0; i < commande.getQuantite(); i++) {
			listProduit.add(p);
		}
		ArrayList<Produit>pList=new ArrayList<Produit>();
		for (int i = 0; i < listProduit.size(); i++) {
			Produit produit=listProduit.get(i);
			Utilitaire.convertProduit(produit);
			pList.add(produit);
		}
		// listAdmin =session.createSQLQuery("SELECT * FROM
		// LigneCommande;").list();
		session.close();
		session.getSessionFactory().close();
		return pList;

	}
	
	public static String getProduitCritere(Produit produit){
		StringBuffer sql=new StringBuffer("SELECT FROM produit WHERE idProd="+produit.getIdProd()+" ");
		if (produit.getDescription()!=null) {
			sql.append(" AND description=\""+produit.getDescription()+"\" ");
		}
		if (produit.getCategorie()!=null) {
			sql.append("AND idCate="+produit.getCategorie().getIdCate()+" ");
		}
		if (new Double(produit.getPrix())!=null) {
			sql.append("AND prix="+produit.getPrix()+" ");
		}
		if (produit.getNomProd()!=null) {
			sql.append("AND nomProd=\""+produit.getNomProd()+"\" ");
		}
		if(new Integer(produit.getStockPhysique())!=null){
			sql.append("AND stockPhysique="+produit.getStockPhysique()+" ");
		}
		if(new Integer(produit.getStockReel())!=null){
			sql.append("AND stockReel="+produit.getStockReel()+" ");
		}
		return sql.toString();
	}
//	public static void main(String[] args) {
//	Produit p =new Produit();
//	Categorie c = new Categorie();
//	c.setIdCate(1);
//	Categorie cat=CategorieDao.selectCategorie(c);
//	p.setIdProd(2);
//	p.setNomProd("prodi");
//	p.setDescription("desc");
//	p.setCategorie(cat);
////	insertProduit(p);
//	deleteProduit(p);
//	
////	Produit pr = selectProduit(p);
////	List<Produit>l =selectAllProduit();
////	System.out.println(l);
//	}
}
